package com.crazyhat.crazyhat.service;

import java.util.List;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.crazyhat.crazyhat.attribute.ClubPositionEnum;
import com.crazyhat.crazyhat.attribute.ClubStatusEnum;
import com.crazyhat.crazyhat.dto.ClubApprovalDTO;
import com.crazyhat.crazyhat.dto.ClubApprovalDetailDTO;
import com.crazyhat.crazyhat.dto.ClubDetailsDTO;
import com.crazyhat.crazyhat.dto.ClubManagementDTO;
import com.crazyhat.crazyhat.dto.ClubUpdateRequestDTO;
import com.crazyhat.crazyhat.dto.CreateClubDTO;
import com.crazyhat.crazyhat.entity.*;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.springframework.web.multipart.MultipartFile;

/**
 * <p>
 * 社团 服务类
 * </p>
 *
 * @author crazyhat
 * @since 2024-07-05
 */
public interface IClubService extends IService<Club> {

    /**
     * 创建新社团
     *
     * @param club
     * @return
     */
    public Club createNewClub(CreateClubDTO createClubDTO);

    /**
     * 根据社团id查询是否是否可加入
     *
     * @param clubId
     * @return
     */
    public boolean clubJoinable(Integer clubId);

    //社团模糊搜索
    List<Club> searchClubs(String keyword, List<String> categories);

    //获取热门社团
    List<Club> getTopClubsByPopularity(int limit);

    //获取最新发布社团
    List<Club> getLatestClubs(int limit);

    //获取社团分类
    List<String> getClubCategories();

    //社团管理 获取社团管理所需信息
    List<ClubManagementDTO> getClubManagementInfo();

    //社团管理 删除社团
    boolean deleteClubs(List<Integer> clubIds);

    //社团管理 查看详情
    ClubDetailsDTO getClubDetails(Integer clubId);

    //社团管理 用户管理
    boolean updateMemberPosition(Integer clubId, Integer studentId, String position) throws JsonProcessingException;

    List<ClubDetailsDTO.MemberInfo> searchMember(Integer clubId, String keyword);

    //社团审核 社团待审核 已通过 已拒绝
    List<ClubApprovalDTO> getClubsInReview();
    List<ClubApprovalDTO> getApprovedClubs();
    List<ClubApprovalDTO> getRejectedClubs();

    //社团审核 查看详情
    ClubApprovalDetailDTO getClubApprovalDetails(Integer clubId);

    //社团审核 同意 拒绝
    boolean updateClubStatus(Integer clubId, ClubStatusEnum status);

        /**
         * 查询社团是否可见，即是否社团状态是否不为已删除或审核中
         *
         * @param clubId
         * @return 可见：true，不可见：False
         */
    boolean isClubsVisibleForUser(Integer clubId);

    /**
     * 判断该用户是否任该社团的某职位，不可判断非社团成员
     * @param clubPositionEnum
     * @param clubId
     * @return
     */
    boolean isSuchClubPosition(ClubPositionEnum clubPositionEnum,Integer clubId);

    /**
     * 查询动态是否对用户可见
     *
     * @param studentId
     * @return 可见：true，不可见：False
     */
    boolean isPostVisibleForUser(Integer clubId, Integer studentId);

    /**
     * 查询用户是否有社区内容发布权限
     * @param clubId
     * @param studentId
     * @return 有权限：true，无权限：False
     */
    boolean hasCommunityContentPublishPower(Integer clubId, Integer studentId);

    public void noticeManager(AdminMessage adminMessage);

    /**
     * 更新社团信息
     * @param clubId
     * @param updateRequest
     * @return
     */
    Club updateClubInfo(Integer clubId, ClubUpdateRequestDTO updateRequest);

    /**
     * 更新社区公开范围
     * @param clubId
     * @param postPublicScope
     * @return
     */


    /**
     * 更新社团热度,应只被定时任务调用
     */
    void updateClubPopularity();

    /**
    * 一把手删除社团
    * */
    boolean deleteClub(int clubId);

    /**
     * 获取社团详情信息，前端用户使用
     * @param clubId
     * @return
     */
    public Club getClubInfo(Integer clubId);

    /**
     * 更换logo
    * */
    public String changeLogo(MultipartFile logo,int clubId);

    Club selectById(Integer clubId);

    /*
    * 更换一把手
    * */
    User changeLeader(int newLeaderId,int clubId);

    /*
    * 一把手踢人
    * */
    boolean kick(int userId, int clubId);

    /*
    * 浏览社团
    * */
    Page<Club> browseClubs(int pageNum,String clubCategory);

    /**
     * 退出社团
     */
    boolean quitClub(int clubId) throws JsonProcessingException;

    // /*
    //  * 增加或减少社团人数
    //  * true为增加,false为减少
    //  * */
    // public void updateClubMembersNum(int clubId,boolean operation);

    /**
     * 普通成员升职成二把手
     */
    Participation memberToSecondLeader(int clubId, int memberId) throws JsonProcessingException;

    /**
     * 二把手降职成普通成员
     */
    Participation secondLeaderToMember(int clubId, int memberId) throws JsonProcessingException;

    /**
     * 通知所有社团成员
     */
    public void notifyAllMembers(int clubId,String content);

    /*
    * 查看所有待审核的信息
    * */
    Page<Application> pendingApplications(int pageNum, int pageSize);
}
